// 折叠基类的函数调用

#include <iostream>

using namespace std;

template <typename... Bases>
class MultiBase : private Bases... {
 public:
  void print() { (..., Bases::print()); }
};
class A {
 public:
  void print() { std::cout << "A::print()" << std::endl; }
};
class B {
 public:
  void print() { std::cout << "B::print()" << std::endl; }
};

// 使用折叠处理类型
// 通过使用类型特征，可以判断类或者函数中传入的参数类型是否相同
template <typename T1, typename... TN>
constexpr bool isSameType(T1, TN...) {
  return (std::is_same_v<T1, TN> && ...);
}

// 将上面的代码封装成类
template <typename T1, typename... TN>
struct C {
  static constexpr bool bValue = (std::is_same_v<T1, TN> && ...);
};


int main() {
  MultiBase<A, B> mB;
  // 通过定义mB，然后再通过mB调用print()触发每个派生类中print函数的调用
  mB.print();  //输出结果为：A::print() B::print()
  std::cout << "--------------------\n";
  std::cout << boolalpha << isSameType(2, 4, 3) << std::endl;
  std::cout << boolalpha << isSameType(2, 4, 3.0) << std::endl;
  std::cout << "--------------------\n";
  std::cout << boolalpha << C<int, int, decltype(80)>::bValue << std::endl;
  std::cout << boolalpha << C<int, float, decltype(80)>::bValue << std::endl;
  // 上面的代码展开后将会变成下面的表达式：
  // std::is_same_v<int, float> && std::is_same_v<int, decltype(80)>

  return 0;
}